//fn main() { let s1 = gives_ownership();
//    println!("s1 = {}", s1);
//
//    let s2 = String::from("hello");
//
//    let s3 = takes_and_gives_back(s2);
//    //println!("s2 = {}", s2);// error s2的所有权已经给了s3，所以这里不能再使用s2了
//    println!("s3 = {}", s3);
//
//    println!("Hello, world!");
//}
//
//fn gives_ownership() -> String{
//    let s = String::from("hello");
//    s
//}
//
//fn takes_and_gives_back(s: String) -> String {
//    s
//}

// 为了避免所有权转移带来的麻烦，Rust 提供了引用（&），让你可以“借用”值而不拥有它。

fn calculate_length(s: &String) -> usize {
    s.len()
}// s 离开作用域，但它不拥有 String，所以不会释放

fn main() {
    let s1 = String::from("hello");
    
    let len = calculate_length(&s1);//借用 s1，不转移所有权 

    println!("s1 = {}", s1);
    println!("s1_len  = {}", len);


    println!("---------------------------------------");
    let mut s = String::from("hello");
    let r1 = &s;
    let r2 = &s;
    let r3 = &mut s;

    // println!("r1 = {}, r2 = {}", r1, r2);// error 只要不可变引用后面不再用，就可以创建可变引用
    println!("r3 = {}", r3);
    println!("---------------------------------------");

    let mut k = String::from ("woainizhongguo");

    let k1 = &mut k;
    let k2 = &k; 
    println!("k2 = {}", k2);
    
    let k3 = &mut k;
    //println!("k1 = {}", k1);
    //println!("k2 = {}", k2);

}


// 可变引用活跃时 → 禁止任何其他引用（无论是可变还是不可变）。
// 不可变引用活跃时 → 仅禁止新的可变引用，但可以继续创建更多的不可变引用。
//
// 规则只看“引用的最后一次使用”是否重叠，而不在乎谁先声明谁后声明。
